/**
 * Copyright (C) 2008 Huascar A. Sanchez.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.gotobject.inject.resources;

import java.lang.annotation.Annotation;

/**
 * comcreate implementation of the {@link Resource resource} annotation.
 *         
 * @author huascar.sanchez@gmail.com (Huascar A. Sanchez)
 * @version $Revision: 23 $ submitted on $Date: 2008-09-13 20:00:59 +0000 (Sat, 13 Sep 2008) $ by $Author: huascar.sanchez $
 */
@SuppressWarnings({"ClassExplicitlyAnnotation"})
class ResourceImpl implements Resource {
    private final String key;

    /**
     * construct a {@code BoundImpl} object, which an instance
     * of the {@link Resource} annotation.
     * @param key
     *      a string-like identifier
     */
	ResourceImpl(String key){
        if(key == null){
            throw new NullPointerException("key is null.");
        }
        this.key = key;
    }

    // implements Annotation#annotationType(): Class<? extends Annotation>
    public Class<? extends Annotation> annotationType() {
        return Resource.class;
    }

    @Override
    public boolean equals(Object obj) {
        return (obj instanceof Resource) && key.equals(((Resource)obj).key());
    }

    @Override
    public int hashCode() {
        // This is specified in java.lang.Annotation's spec.
        return (127 * "key".hashCode()) ^ key.hashCode();
    }

    // implements Resource#key():String
    public String key() {
        return key;
    }

    @Override
    public String toString() {
        return new StringBuilder("@")
                .append(Resource.class.getName())
                .append("(key=")
                .append(key()).append(")")
                .toString();
    }

}
